package Seven_sorts;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.concurrent.ThreadLocalRandom;

/**
 * 测试七大排序
 */
public class SortTest {
    //生成随机数的一个类
    private static final ThreadLocalRandom random=ThreadLocalRandom.current();

    /**
     * 产生一个大小为n的随机整数数组，数组的取值范围为[l...r]
     * @param n  数组的元素个数
     * @param l  数组的取值最小值
     * @param r  数组的取值最大值
     * @return
     */
    public static int[] generaRabdomArrary(int n,int l,int r){
        int[] data=new int[n];
        for (int i = 0; i <n ; i++) {
            //生成了一个[l...r)的随机数放在数组中
            data[i]= random.nextInt(l,r);
        }
        return data;
    }

    /**
     * 生成一个大小为n的近乎有序的数组
     * @param n  元素个数
     * @param swaptinmes  交换的次数，次数越大，数组越无序
     * @return
     */
    public static int[] generateSortArrary(int n,int swaptinmes){
        //先生成一个有序数组
        int[] data =new int[n];
        for (int i = 0; i < n; i++) {
            data[i]=i;
        }
        //对有序数组的部分元素进行交换
        for (int i = 0; i <swaptinmes; i++) {
            int a= random.nextInt(n);
            int b= random.nextInt(n);
            int temp=data[a];
            data[a]=data[b];
            data[b]=temp;
        }
        return data;
    }

    /**
     * 深拷贝数组
     * @param arr
     * @return
     */
    public static int[] arraryCopy(int[] arr){
        return Arrays.copyOf(arr,arr.length);
    }

    /**
     * 在指定的数组arr上测试名称为sortName的排序耗时
     * @param arr
     * @param sortName
     */
    public static void testSort(int[] arr,String sortName){
        Class<SevenSort> cla=SevenSort.class;
        try {
            //根据战法名称拿到算法
            Method method= cla.getDeclaredMethod(sortName,int[].class);
            //计时
            long start=System.nanoTime();
            method.invoke(null,arr);
            long end=System.nanoTime();
            if (isSorted(arr)){
                System.out.println(sortName+"排序完成，共耗时："+(end-start)/1000000.0+"ms");
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 检查当前数组是否是一个非降序数组
     * @param arr
     * @return
     */
    private static boolean isSorted(int[] arr){
        for (int i = 0; i < arr.length-1; i++) {
            if (arr[i]>arr[i+1]){
                System.out.println("排序算法有误！");
                return false;
            }
        }
        return true;
    }
}



